home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / examples / helpsigs / Parser.grm < prev    next >
Encoding:
Text File  |  1997-08-18  |  7.0 KB  |  323 lines  |  [TEXT/R*ch]

  1. %{
  2.  
  3. open Fnlib Config Mixture Const Globals Location Types Asynt Asyntfn;
  4.  
  5. %}
  6.  
  7. %token ABSTRACTION ABSTYPE AND ANDALSO AS CASE DATATYPE DO ELSE END
  8. %token EQTYPE EXCEPTION
  9. %token FN FUN HANDLE IF IN INFIX INFIXR LET LOCAL
  10. %token NONFIX OF OP ORELSE RAISE REC SIG SIGNATURE STRUCT STRUCTURE
  11. %token THEN TYPE VAL WHILE WITH WITHTYPE
  12.  
  13. %token EQUALS
  14. %token COMMA ARROW DARROW BAR STAR HASH
  15. %token LBRACE RBRACE HASHLBRACKET LBRACKET RBRACKET LPAREN RPAREN
  16. %token COLON SEMICOLON UNDERBAR DOTDOTDOT
  17.  
  18. %token OPEN PRIM_VAL PRIM_TYPE PRIM_EQTYPE PRIM_REFTYPE
  19.  
  20. %token <string> ID
  21. %token <Const.QualifiedIdent> QUAL_ID QUAL_STAR
  22.  
  23. %token <int> ZDIGIT NZDIGIT ZPOSINT2 NZPOSINT2 NEGINT
  24. %token <word> WORD
  25. %token <char> CHAR
  26. %token <real> REAL
  27. %token <string> STRING
  28.  
  29. %token QUOTEL
  30. %token <string> QUOTER QUOTEM
  31.  
  32. %token <string> TYVAR
  33.  
  34. %token EOF
  35.  
  36. %right    AND
  37. %nonassoc DARROW
  38. %nonassoc BAR
  39. %nonassoc ELSE
  40. %nonassoc DO
  41. %nonassoc RAISE
  42. %right    HANDLE
  43. %right    ORELSE
  44. %right    ANDALSO
  45. %right    AS
  46.  
  47. %nonassoc COLON
  48. %right    ARROW
  49. %nonassoc ID EQUALS
  50. %right    STAR
  51.  
  52. %start SigFile
  53. %type <Asynt.Sig> SigFile
  54.  
  55. %type <bool> EOPh
  56. %type <string> Ident EqIdent UnitName
  57. %type <Location.Location * string> LocUnitName
  58. %type <Asynt.IdInfo> OpIdent OpEqIdent TypeIdent LongTypeIdent
  59. %type <Asynt.TyVar> TyVar
  60. %type <string list> UnitName_seq1
  61. %type <int> NumLabel Arity
  62. %type <unit> SemiEof
  63. %type <Mixture.Lab> Label
  64. %type <Asynt.PrimValBind list> PrimValBind AndPrimValBind_opt
  65. %type <Asynt.TypBind list> TypBind AndTypBind_opt
  66. %type <Asynt.TypDesc list> TypDesc AndTypDesc_opt
  67. %type <Asynt.DatBind list> DatBind AndDatBind_opt
  68. %type <Asynt.ConBind list> ConBind BarConBind_opt
  69. %type <Asynt.TypBind list option> WithType_opt
  70. %type <Asynt.ExDesc list> ExDesc AndExDesc_opt
  71. %type <Asynt.Ty option> OfTy_opt ColonTy_opt
  72. %type <Asynt.Ty> Ty Ty_sans_STAR AtomicTy
  73. %type <Asynt.Ty list> TupleTy TyComma_seq2
  74. %type <Asynt.Ty Mixture.Row> TyRow_opt TyRow CommaTyRow_opt
  75. %type <Asynt.TyVar list> TyVarSeq TyVarComma_seq1
  76.  
  77. %type <Asynt.Spec> Spec KWSpec
  78. %type <Asynt.Spec list> KWSpec_seq
  79. %type <Asynt.ValDesc list> ValDesc AndValDesc_opt
  80.  
  81. %%
  82.  
  83. Ident :
  84.     ID          { $1 }
  85.   | STAR        { "*" }
  86. ;
  87.  
  88. OpIdent :
  89.     Ident       { mkIdInfo (mkLoc { qual="", id=$1 }) false }
  90.   | OP Ident    { mkIdInfo (mkLoc { qual="", id=$2 }) true }
  91. ;
  92.  
  93. OpEqIdent :
  94.     EqIdent     { mkIdInfo (mkLoc { qual="", id=$1 }) false }
  95.   | OP Ident    { mkIdInfo (mkLoc { qual="", id=$2 }) true }
  96. ;
  97.  
  98. EqIdent :
  99.     Ident       { $1 }
  100.   | EQUALS      { "=" }
  101. ;
  102.  
  103. LocUnitName :
  104.     UnitName    { mkLoc($1) }
  105. ;
  106.  
  107. UnitName :
  108.     Ident       { normalizedUnitName $1 }
  109.   | EQUALS      { "=" }
  110. ;
  111.  
  112. TypeIdent :
  113.     ID          { mkIdInfo (mkLoc { qual="", id=$1 }) false }
  114. ;
  115.  
  116. LongTypeIdent :
  117.     TypeIdent   { $1 }
  118.   | QUAL_ID     { mkIdInfo (mkLoc $1) false }
  119. ;
  120.  
  121. TyVar :
  122.     TYVAR    { mkIdInfo (mkLoc { qual="", id=$1 }) false }
  123. ;
  124.  
  125. UnitName_seq1 :
  126.     UnitName UnitName_seq1      { $1 :: $2 }
  127.   | UnitName                    { [$1] }
  128. ;
  129.  
  130. NumLabel :
  131.     NZPOSINT2   { $1 }
  132.   | NZDIGIT     { $1 }
  133. ;
  134.  
  135. Label :
  136.     Ident       { STRINGlab $1 }
  137.   | NumLabel    { INTlab $1 }
  138. ;
  139.  
  140. Arity :
  141.     ZPOSINT2    { $1 }
  142.   | NZPOSINT2   { $1 }
  143.   | ZDIGIT      { $1 }
  144.   | NZDIGIT     { $1 }
  145. ;
  146.  
  147. EOPh :
  148.     SEMICOLON   { false }
  149.   | EOF         { true }
  150. ;
  151.  
  152. SemiEof :
  153.     SEMICOLON SemiEof   { }
  154.   | EOF            { }
  155. ;
  156.  
  157. PrimValBind :
  158.     OpIdent COLON Ty EQUALS Arity STRING AndPrimValBind_opt
  159.                         { ($1, $3, $5, $6) :: $7 }
  160. ;
  161.  
  162. AndPrimValBind_opt :
  163.     AND PrimValBind     { $2 }
  164.   | /* */               { [] }
  165. ;
  166.  
  167. TypBind :
  168.     TyVarSeq TypeIdent  EQUALS Ty AndTypBind_opt
  169.                         { ($1, $2, $4) :: $5 }
  170. ;
  171.  
  172. AndTypBind_opt :
  173.     AND TypBind         { $2 }
  174.   | /* */               { [] }
  175. ;
  176.  
  177. DatBind :
  178.     TyVarSeq TypeIdent EQUALS ConBind AndDatBind_opt
  179.                         { ($1, $2, $4) :: $5 }
  180. ;
  181.  
  182. AndDatBind_opt :
  183.     AND DatBind         { $2 }
  184.   | /* */               { [] }
  185. ;
  186.  
  187. ConBind :
  188.     OpIdent OfTy_opt BarConBind_opt     { ConBind($1, $2) :: $3 }
  189. ;
  190.  
  191. BarConBind_opt :
  192.     BAR ConBind         { $2 }
  193.   | /* */               { [] }
  194. ;
  195.  
  196. WithType_opt :
  197.     WITHTYPE TypBind    { SOME $2 }
  198.   | /* */               { NONE }
  199. ;
  200.  
  201. ExDesc :
  202.     OpIdent OfTy_opt AndExDesc_opt              { ($1,$2) :: $3 }
  203. ;
  204.  
  205. AndExDesc_opt :
  206.     AND ExDesc          { $2 }
  207.   | /* */               { [] }
  208. ;
  209.  
  210. ColonTy_opt :
  211.     COLON Ty    { SOME $2 }
  212.   | /* */       { NONE }
  213.  
  214. OfTy_opt :
  215.     OF Ty       { SOME $2 }
  216.   | /* */       { NONE }
  217. ;
  218.  
  219. Ty :
  220.     TupleTy ARROW Ty    { mkLoc(FNty( tupleTy $1, $3)) }
  221.   | TupleTy             { tupleTy $1 }
  222. ;
  223.  
  224. TupleTy :
  225.     Ty_sans_STAR                { [$1] }
  226.   | Ty_sans_STAR STAR TupleTy   { $1 :: $3 }
  227. ;
  228.  
  229. Ty_sans_STAR :
  230.     LPAREN TyComma_seq2 RPAREN LongTypeIdent    { mkLoc(CONty($2, $4)) }
  231.   | Ty_sans_STAR LongTypeIdent                  { mkLoc(CONty([$1], $2)) }
  232.   | AtomicTy                                    { $1 }
  233. ;
  234.  
  235. TyComma_seq2 :
  236.     Ty COMMA TyComma_seq2       { $1 :: $3 }
  237.   | Ty COMMA Ty                 { [$1, $3] }
  238. ;
  239.  
  240. AtomicTy :
  241.     LongTypeIdent               { mkLoc(CONty([], $1)) }
  242.   | TyVar                       { mkLoc(TYVARty $1) }
  243.   | LBRACE TyRow_opt RBRACE     { mkLoc(RECty $2) }
  244.   | LPAREN Ty RPAREN            { $2 }
  245. ;
  246.  
  247. TyRow_opt :
  248.     TyRow       { $1 }
  249.   | /* */       { [] }
  250. ;
  251.  
  252. TyRow :
  253.     Label COLON Ty CommaTyRow_opt       { ($1,$3)::$4 }
  254. ;
  255.  
  256. CommaTyRow_opt :
  257.     COMMA TyRow         { $2 }
  258.   | /* */               { [] }
  259. ;
  260.  
  261. TyVarSeq :
  262.     TyVar                               { [$1] }
  263.   | LPAREN TyVarComma_seq1 RPAREN       { $2 }
  264.   | /* */                               { [] }
  265. ;
  266.  
  267. TyVarComma_seq1 :
  268.     TyVar COMMA TyVarComma_seq1         { $1 :: $3 }
  269.   | TyVar                               { [$1] }
  270. ;
  271.  
  272. SigFile :
  273.     SIGNATURE LocUnitName EQUALS SIG KWSpec_seq END SemiEof
  274.                         { NamedSig{locsigid = $2, specs = $5 } }
  275.   | KWSpec_seq EOF    { AnonSig $1 }
  276. ;
  277.  
  278. KWSpec_seq :
  279.     KWSpec KWSpec_seq        { $1 :: $2 }
  280.   | SEMICOLON KWSpec_seq    { $2 }
  281.   | /* */            { [] }
  282. ;
  283.  
  284. Spec :
  285.     KWSpec Spec         { mkLoc(SEQspec($1, $2)) }
  286.   | SEMICOLON Spec      { $2 }
  287.   | /* */               { mkLoc(EMPTYspec) }
  288. ;
  289.  
  290. KWSpec :
  291.     VAL ValDesc                 { mkLoc(VALspec $2) }
  292.   | PRIM_VAL PrimValBind        { mkLoc(PRIM_VALspec $2) }
  293.   | TYPE TypBind                { mkLoc(TYPEspec $2) }
  294.   | TYPE TypDesc                { mkLoc(TYPEDESCspec(FALSEequ, $2)) }
  295.   | EQTYPE TypDesc              { mkLoc(TYPEDESCspec(TRUEequ, $2)) }
  296.   | PRIM_REFTYPE TypDesc        { mkLoc(TYPEDESCspec(REFequ, $2)) }
  297.   | DATATYPE DatBind WithType_opt
  298.                                 { mkLoc(DATATYPEspec($2,$3)) }
  299.   | EXCEPTION ExDesc            { mkLoc(EXCEPTIONspec $2) }
  300.   | LOCAL Spec IN Spec END      { mkLoc(LOCALspec($2,$4)) }
  301.   | OPEN UnitName_seq1          { mkLoc(OPENspec $2) }
  302. ;
  303.  
  304. ValDesc :
  305.     OpEqIdent COLON Ty AndValDesc_opt
  306.                         { ($1, $3) :: $4 }
  307. ;
  308.  
  309. AndValDesc_opt :
  310.     AND ValDesc         { $2 }
  311.   | /* */               { [] }
  312. ;
  313.  
  314. TypDesc :
  315.     TyVarSeq TypeIdent AndTypDesc_opt
  316.                         { ($1, $2) :: $3 }
  317. ;
  318.  
  319. AndTypDesc_opt :
  320.     AND TypDesc         { $2 }
  321.   | /* */               { [] }
  322. ;
  323.